springmvc的请求方式支持
在springmvc中,提供了@RequestMapping
注解帮助我们快速配置一个handler处理器。同时提供了method
属性支持定义请求方式。如:@RequestMapping(value = "/handle",method = {RequestMethod.POST})
。该url:/handle只支持post的请求方式。
springmvc对Restful风格的支持
我们都知道springmvc已经对Restful风格的url提供了支持,Restful建议使用post
、get
、delete
、put
四种请求方式分别对资源进行增加、查询、删除、修改操作。
在springmvc开发中,我们可以使用@RequestMapping
注解定义Restful风格的支持,或者@PostMapping
、@GetMapping
、@DeleteMapping
、@PutMapping
等注解。
但是我们开发中一般使用post
和get
请求方式。对于delete
和put
基本不会使用,因为这两种请求方式不安全。
问题点
在Restful风格中,需要我们对删除和修改分别使用delete
、put
方式请求。如果我们使用了这两种请求方式,那么的确符合了Restful风格,但是存在风险。如果不使用我们设计的接口URL就不是Restful风格的。
解决方案
springmvc就是基于这个问题提供了解决方案。你可以使用post
方式请求接口,但是web应用中可以配置过滤器来将请求方式转换。
好处
- 接口调用者使用
post
这种安全的方式请求web应用提供的接口 - web应用内部接口定义
put
、delete
等方式请求,符合Restful风格规范 - 接口调用者使用
post
请求到web应用使用put
、delete
请求方式接受的处理交给springmvc提供的过滤器
开发流程
- web.xml中配置过滤器
org.springframework.web.filter.HiddenHttpMethodFilter
(如果是spring-boot搭建的项目参考spring-boot对于Filter的配置就可以了) - 对于
put
、delete
请求的时候使用post
方式请求,同时增加一个参数_method=delete
,定义实际的请求方式
代码
web.xml配置文件
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<!--拦截所有的请求-->
<url-pattern>/*</url-pattern>
</filter-mapping>
java代码
/*
* restful delete方式 /demo/handle/15
*/
@RequestMapping(value = "/handle/{id}",method = {RequestMethod.DELETE})
public ModelAndView handleDelete(@PathVariable("id") Integer id) {
Date date = new Date();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("date",date);
modelAndView.setViewName("success");
return modelAndView;
}
请求url
post方式请求:http://localhost:8080/demo/handle/1?_method=delete
注意 对于请求方式的转换不要用get,要用post请求才可以转换